/**
 * 跳转到定义示例，本示例支持`package.json`中`dependencies`、`devDependencies`跳转到对应依赖包。
 */
const vscode = require('vscode');
const path = require('path');
const fs = require('fs');
const util = require('./util');
const readline = require('readline');
/**
 * 查找文件定义的provider，匹配到了就return一个location，否则不做处理
 * 最终效果是，当按住Ctrl键时，如果return了一个location，字符串就会变成一个可以点击的链接，否则无任何效果
 * @param {*} document 
 * @param {*} position 
 * @param {*} token 
 */
function provideDefinition(document, position, token) {
    const fileName    = document.fileName;
    const workDir     = path.dirname(fileName);
    const word        = document.getText(document.getWordRangeAtPosition(position));
    const line        = document.lineAt(position);
    const projectPath = util.getProjectPath(document);

    // console.log('====== 进入 provideDefinition 方法 ======');
    // console.log('fileName: ' + fileName); // 当前文件名
    // console.log('workDir: ' + workDir); // 当前文件所在目录
    // console.log('word: ' + word); // 当前光标所在单词
    // console.log('line: ' + line.text); // 当前光标所在行
    // console.log('projectPath: ' + projectPath); // 当前工程目录

    var re = /actions\.(\w+)\.(\w+)/
        if(line.text.search(re)>0){
            var namespace =""
            var funname =""
            line.text.replace(/\s/g,"").replace(re,function($0,$1,$2){
                namespace =$1
                funname =$2
            })
            const content =  fs.readFileSync(projectPath+"\\sourcemap.json", 'utf-8');   //读取映射文件
            const sourcemap = JSON.parse(content)  //转为json对象
            const dd = sourcemap[namespace]
            if(dd.length>0){
                const modelfile =  fs.readFileSync(dd, 'utf-8');   //读取映射文件
                var pos = util.findFun(funname,modelfile)
                // if(pos!=null){}
                return new vscode.Location(vscode.Uri.file(dd), new vscode.Position(pos.i, pos.j));
            }
        }
    
}

module.exports = function(context) {
    // 注册如何实现跳转到定义
    context.subscriptions.push(vscode.languages.registerDefinitionProvider([
        { scheme: 'file', language: 'javascript' },
        { scheme: 'file', language: 'javascriptreact' }
    ], {
        provideDefinition
    }));
};